package ModuloLocacao;

import java.util.*;
import java.io.*;
import ModuloCliente.*;
import ModuloFilme.FachadaFilme;
import ModuloFilme.Filme;
import ModuloFuncionario.FachadaFuncionario;
import ModuloFuncionario.Funcionario;
import ModuloFuncionario.TelaFuncionario;


public class TelaLocacao {
	
	private Scanner Read = new Scanner(System.in);
	private Console console = System.console();
    private FachadaCliente fachadaCliente;
    private FachadaFilme fachadaFilme;
    private FachadaLocacao fachadaLocacao;
    FachadaFuncionario fachadaFuncionario;
    
	public TelaLocacao() {
		super();
		fachadaCliente = FachadaCliente.getInstancia();
		fachadaLocacao = FachadaLocacao.getInstancia();
		fachadaFuncionario = FachadaFuncionario.getInstancia();
		fachadaFilme = FachadaFilme.getInstancia();
		
	}

	public void menuLocacao(){
    	apagaTela();
    	System.out.println("-------------------------------------");
		System.out.println("****** SOFTWARE VIDEO LOCADORA ******");
		System.out.println("-------------------------------------");
    	System.out.println("*********** MENU LOCACAO ************");
    	System.out.println("-------------------------------------\n");
        System.out.println("[1] Nova Locacao ( fazer testes )");
        System.out.println("[2] Receber Locacao ( fazer testes )");
        System.out.println("[3] Locacoes Pendentes ( Precisa refazer algumas coisas )");
        System.out.println("[0] Menu Inicial");
        System.out.print("Opcao: ");
        char opcao = Read.next().charAt(0);
        
        switch(opcao) {
            case '1': novaLocacao();
            break;
            case '2': receberLocacao();
            break;
            case '3': locacoesPendentes();
                break;
            case '0': TelaFuncionario.menuFuncionario(); 
            break;
            default: 
            	System.out.println("* opcao invalida!");
            	console.readLine();
        		menuLocacao();
        }
    } // Termino do menu principal
	
	// metodo apaga tela
    private void apagaTela(){
    	System.out.print( "\033[H\033[2J" ); 
    }
    
    // Metodo nova Locacao
    private void novaLocacao(){
    	
    	Cliente cliente = null;
    	Vector<Filme> filmesArray;
    	String opcao2 = null;
    	
    	System.out.println();
    	System.out.print("Digite o CPF do cliente titular: ");
    	String cpf = console.readLine();
    	if(fachadaCliente.pesquisarCpf(cpf)){ // Verifica se o cliente existe
    		
    		cliente = fachadaCliente.buscarCliente(cpf);
    		Vector<Dependente> dep = fachadaCliente.buscarDependente(cpf);
    		filmesArray = new Vector<Filme>();
    		
    		apagaTela();
    		// Dados do Cliente
    		System.out.println("-----------------");
    		System.out.println("| ** TITULAR ** |");
    		System.out.println("---------------------------------------------------------------");
    		System.out.println("Nome: " + cliente.getNome() + "   |  CPF: " + cliente.getCpf());
    		System.out.println("---------------------------------------------------------------");
    		System.out.println("---------------------");
    		System.out.println("| ** DEPENDENTES ** |");
    		System.out.println("---------------------------------------------------------------");
    			for (int i = 0 ; i < dep.size() ; i++){
    				System.out.println((i+1) + ". " + dep.get(i).getNome() +
    						"  |  Parentesco: " + dep.get(i).getParentesco());
    			}
    			System.out.println("---------------------------------------------------------------");
    			System.out.print("Digite o nome do locatario: ");
    			String locatario = console.readLine(); // Quem esta locando  		
    		
    		// Adicionando filmes a locação
    			boolean addFilmes = true;
    			
    			do{ // Adicionando filmes a locação
    				apagaTela();
    				System.out.println("--------- FILMES -----------");
    					for (int i = 0; i < filmesArray.size(); i++) {
    						System.out.print("Titulo: " + filmesArray.get(i).getTitulo()); 
    						System.out.printf("   -   Preco R$%.2f\n",filmesArray.get(i).getPreco());
						}
    				System.out.println("----------------------------");
    				System.out.print("Digite o codigo do filme: ");
    				String codigo = console.readLine();
    				
    				Filme filme = fachadaFilme.buscarFilme(codigo);
    					if (filme != null){ // verifica se o filme existe
    						int quant = fachadaFilme.verificaQuantidade(codigo);
    						// Verifica se existem filmes em estoque
    						if (quant > 0){
    						System.out.println("--------------------------------------------");
    						System.out.println("Titulo: " + filme.getTitulo());
    						System.out.println("Descricao: " + filme.getDescricao());
    						System.out.printf("Preco: %.2f\n", filme.getPreco());
    						System.out.println("--------------------------------------------");
    						System.out.print("Digite [1] para adiciona-lo a locacao ou <<Enter>> para continuar: ");
    								opcao2 = console.readLine();
    								if (opcao2.equals("1")) {
    									filmesArray.add(filme);
    									fachadaFilme.setQuantidadeFilme(codigo);
    								}
    						} else {
    							System.out.println("Todos locados!");
    						}
    							
    					} else {
    						System.out.println("Filme nao encontrado!");
    					}
    					
    					apagaTela();
    					System.out.println("--------------------------------------------");
    					// Verifica se o usuario vai adicionar outros filmes
    					System.out.println("* Para adicionar outro filme tecle [1]");
    					System.out.print("* Continuar tecle <<Enter>>: ");
    					opcao2 = console.readLine();
    					// Verifica se o usuario vai adicionar outros filmes
						if (!opcao2.equals("1")) {
							addFilmes = false;
						}
    			} while (addFilmes); // termino do adicionar filmes a locação
    		
    		double valorLocacao = 0; // laço para somar o valor da locação
    			for(int i=0 ; i < filmesArray.size() ; i++){
    				valorLocacao += filmesArray.get(i).getPreco();
    			}
    		System.out.printf("Valor da locacao: R$ %.2f\n",valorLocacao);
    		double valorPago = 0;
    			do{ //verifica se o valor digitado é um numero valido
    				System.out.print("Digite o valor pago: R$ ");
    				String testaNum = console.readLine();
    				try{
    					
    					valorPago = Double.parseDouble(testaNum);
    					break;
    					
    				}catch (NumberFormatException e) {
						System.out.println("Valor invalido!");
					}
    				
    			} while (true);
    			
    		if(valorPago > valorLocacao){ // verifica se havera troco
    			System.out.printf("Troco: R$ %.2f\n", (valorPago - valorLocacao));
    			valorPago = valorLocacao;
    		}
    		
    		char opcao;
    		
    		do { // Laço para saber se a locação sera efetivada
    			
    			System.out.print("Deseja efetivar locacao? S/N: ");
    			opcao = Read.next().toUpperCase().charAt(0);
    				if( opcao == 'S'){
    					Funcionario atendente = fachadaFuncionario.login(fachadaFuncionario.getLogado()); 
    					Locacao locacao = new Locacao(cliente,atendente,locatario,valorPago,filmesArray);
    					fachadaLocacao.inserirLocacao(locacao);
    				} else if ( opcao != 'S' && opcao != 'N'){
    					System.out.println("* Opcao invalida!");
    				}
    				
    		} while( (opcao != 'S' && opcao != 'N'));
    		
    		System.out.println("(( Press <<Enter>> ))");
    		console.readLine();
    		menuLocacao();
    		
    	} else {
    		System.out.println("Cliente não encontrado! (( Press <<Enter>> ))");
    		console.readLine();
    		menuLocacao();
    	}
    	 	
    } // Termino do metodo nova locação
    
    public void receberLocacao(){
    	
    	System.out.println();
    	System.out.print("Digite o cpf do titular: ");
    	String cpf = console.readLine();
    	System.out.println();
    	Cliente cliente = fachadaCliente.buscarCliente(cpf);
    	
    		if( cliente != null ){ // Verifica se o cliente existe
    			
    			Vector<Locacao> arrayLocacoes = fachadaLocacao.locacoesPendentes();
    			int numLocacoesPendentes = 0; // Contar numero de locacoes pendentes para o cliente
    			
    			for (int i = 0; i < arrayLocacoes.size(); i++) {
					if(arrayLocacoes.get(i).getCliente().getCpf().equals(cpf) && arrayLocacoes.get(i).isPendente() == true){
						numLocacoesPendentes++;
					}
				}
    			
    				if(numLocacoesPendentes > 0){
    					
    					apagaTela();
    	    			System.out.println("----------- LOCACOES PENDENTES -------------");
    	    			System.out.println("Cliente titular: " + cliente.getNome());
    	    			for (int i = 0; i < arrayLocacoes.size(); i++) {
    						if(arrayLocacoes.get(i).getCliente().getCpf().equals(cpf) && arrayLocacoes.get(i).isPendente() == true){
    							System.out.println("--> Locatario: " + arrayLocacoes.get(i).getLocatario());
    							System.out.println("--------------------------------------------");
    							System.out.println("------");
    							for (int j = 0; j < arrayLocacoes.get(i).getFilmes().size(); j++) { // imprime os filmes
									System.out.println("Titulo filme: "+ arrayLocacoes.get(i).getFilmes().get(j).getTitulo());
									System.out.printf("Preco: R$ %.2f\n",arrayLocacoes.get(i).getFilmes().get(j).getPreco());
									System.out.println("------");		
								}
    							System.out.println("--------------------------------------------");
    							System.out.printf("Valor da locacao: R$ %.2f\n",arrayLocacoes.get(i).getValorLocacao());
    							System.out.printf("Valor pago: %.2f\n",arrayLocacoes.get(i).getValorPago());
    							double vLocacao = arrayLocacoes.get(i).getValorLocacao();
    							double vPago = arrayLocacoes.get(i).getValorPago();
    							double vRecebido = -1.0;
    							System.out.printf("Valor a receber: R$ %.2f\n",(vLocacao - vPago));
    							
    								if((vLocacao - vPago) > 0){// verifica se existe valor a receber
    									String testaNum = null; // Recebe um numeral para teste
    						
    									do{// verifica se o valor digitado é valido
    										System.out.print("Valor recebido: R$ ");
    										testaNum = console.readLine();
    								
    											try{
    												vRecebido = Double.parseDouble(testaNum);
    												break;
    											} catch (NumberFormatException e) {
    												System.out.println("Valor invalido");
    										}
    									
    									} while(true);
    								}
    							
    							if(vRecebido >= arrayLocacoes.get(i).getValorLocacao()){
    								System.out.printf("Troco: R$ %.2f\n",( vRecebido - vLocacao));
    								arrayLocacoes.get(i).setPendente(false);
    								console.readLine();
    								menuLocacao();
    							} else if ((vLocacao - vPago) == 0){
    								arrayLocacoes.get(i).setPendente(false);
    								console.readLine();
    								menuLocacao();
    							} else {
    								menuLocacao();
    							}
    
    					}
    						console.readLine();
    				} // Fim do for mais externo

    				} else {
    					System.out.println("* Nao existe locacoes pendentes para este CPF!");
    					console.readLine();
    					menuLocacao();
    				}

    		} else {
    			System.out.println("Cliente nao encontrado!");
    			console.readLine();
				menuLocacao();
    		}
    	
    } // termino do metodo receberLocacao
    
    public void locacoesPendentes(){
    	apagaTela();
    	Vector<Locacao> locacoes = fachadaLocacao.locacoesPendentes();
    	
    	for(int i = 0 ; i < locacoes.size() ; i++){
    		System.out.println("----------");
    		System.out.println(" Locacao |");
    		System.out.println("---------------------------------------------------------------");
    		System.out.println("Cliente Titular: " + locacoes.get(i).getCliente().getNome());
    		System.out.println("Cliente locatario(a): " + locacoes.get(i).getLocatario());
    		System.out.println("Atendente: " + locacoes.get(i).getAtendente().getNome());
    		System.out.println("-------------");
    		System.out.println("| Filmes    |");
    		
    		Vector<Filme> filmes = locacoes.get(i).getFilmes();
    		System.out.println("---------------------------------------------------------------");
    			for(int j = 0 ; j < filmes.size(); j++){
    				System.out.print((j + 1) + ". Titulo: " + filmes.get(j).getTitulo() + "  -  ");
    				System.out.printf("Valor unit. R$ %.2f \n", filmes.get(j).getPreco());
    			}
    			System.out.println("---------------------------------------------------------------");
    		System.out.printf("Valor da locacao : R$ %.2f \n", locacoes.get(i).getValorLocacao());
    		System.out.println("---------------------------------------------------------------");
    		System.out.printf("Valor pago : R$ %.2f \n", locacoes.get(i).getValorPago());
    		System.out.println("---------------------------------------------------------------");
    	}
    	System.out.println("(( Press <<Enter>> ))");
		console.readLine();
		menuLocacao();
    }

}
